function main() {		
	var collection;
	var traderColl;
	var docEntry;
	var centry;
	var itemAlterCodeID;
	var itemEntryID;
	var itemAlterCode;
	var codeVal;
    var nameVal;
	var splrID = null;
	var supplier;
	var supplierID;
	var supplierBranch;
	var traderID;
	var trader;
	var traderBranch;
	var line;
	var actLogger;
	var warnings;
	
	var logger = sc$APIContext.GetActionLogger();

	var dic = sc$Context.JsonDeserialize(sc$APIContext.GetImportBuffer());

	if (dic["SupplierID"] != null) {
		if (dic["SupplierID"] != null) {
			traderID = sc$ApplImportScript.FindRecord("heSuppliers", true, ["heID"], [dic["SupplierID"].toString()], "heTrdrID");
		} 
		//return sc$Context.JsonSerialize(traderID);	
		traderColl = sc$Context.DataObjects.GetMasterByID("Hercules", "Traders", traderID);							
		traderColl.Logic.DisableConstraints();
		trader = traderColl[0];	
				
		if (trader.Suppliers.Count > 0) {
			supplier = trader.Suppliers.SearchByField("ID", dic["SupplierID"].toString());
		}	
		
		if(supplier==null)
		{
			supplier = trader.Suppliers[0];			
		}
		traderBranch = trader.TraderBranches[0];
			
		if (traderBranch != undefined) {
			supplierBranch = traderBranch.SupplierBranches.SearchByField("SplrID", supplier.ID);
		}		
				
		if (traderBranch != undefined) {
			traderBranch.EndEdit();
		}
		trader.EndEdit();	
		
		actLogger = sc$ApplImportScript.SaveFromImport("Hercules", "Suppliers", traderColl);
		logger.Merge(actLogger);
	}
	
	collection = sc$Context.DataObjects.NewMaster("Hercules", "PurchaseEntries");
	collection.Logic.DisableConstraints();
	docEntry = collection[0];

	docEntry.OperationFlags.Add(docEntry.DentOperationFlagEnum.FillValuesMissing);
	docEntry.OperationFlags.Add(docEntry.DentOperationFlagEnum.AddKitItemLines);
	centry = docEntry.ComEntries[0];
	
	docEntry.SetValue("SourceType", 1);
	//centry.SetValue("CmdtType", 1);		// sales orders
	
	if (dic["DocCode"] != null) {
		docEntry.SetValue("DocCode", dic["DocCode"]);
	}
	if (dic["DocNumber"] != null) {
		docEntry.SetValue("DocNum", dic["DocNumber"]);
	}
	
	if (dic["SeriesCode"] != null || dic["SeriesShortcut"] != null) {
        var seriesCode = null;
		var seriesShcut = null;
		
		if (dic["SeriesCode"] != null) {
			seriesCode = dic["SeriesCode"];
		}
		if (dic["SeriesShortcut"] != null) {
			seriesShcut = dic["SeriesShortcut"];
		}
		var seriesID = sc$ApplImportScript.FindPurchaseSeries(seriesCode, seriesShcut);
		if (seriesID != null) {
			docEntry.SetValue("DcsrID", seriesID);			
		}
		else {
			sc$ApplImportScript.RaiseError(60, seriesCode, seriesShcut, dic["@@Signature"]);
		}
    }
	
	if (supplier != undefined && supplier != null) {
		centry.SetValue("BillSplrID", supplier.ID);
	}
	if (supplierBranch != undefined && supplierBranch != null) {
		centry.SetValue("BillSpBrID", supplierBranch.ID);
	}
	
	docEntry.SetValue("CompID", sc$Application.CurrentCompanyID);
	
	var cmbrID = sc$APIContext.GetBranchID();
	if (cmbrID != null) {
		docEntry.SetValue("CmbrID", cmbrID);
	}
	var cbwhID = dic["WarID"];
	if (cbwhID != null) {
		centry.SetValue("CbwhID", cbwhID);
	}

	var TpurID = dic["TransportPurposeID"];
	if (TpurID != null) {
		centry.SetValue("TpurID", TpurID);
	}
		
	//var agentID = dic["agent"];
	//if (agentID != null) {
	//	centry.SetValue("AgntID", agentID);
	//}

	if (dic["PmmtCode"] != null || dic["PmmtName"] != null){            
		codeVal = null;
		nameVal = null;
		if (dic["PmmtCode"] != null && dic["PmmtCode"].length > 0) {
			codeVal = dic["PmmtCode"];
		} else if (dic["PmmtName"] != null){					
			nameVal = dic["PmmtName"];
		}
		FindLookupItem(codeVal, nameVal, "hePaymentMethods", "PmmtID", centry);			
	}	
	
	var dicLines = sc$Context.JsonDeserialize(dic["Lines"]);

	for (var i = 0; i < dicLines.Count; i++) {
	
		itemAlterCodeID = null;
		itemEntryID = null;
		codeVal = null;
		nameVal = null;
		
		line = centry.Lines.New();	
		centry.Lines.Add(line);

		if (dicLines[i]["CenlItemCode"] != null || dicLines[i]["CenlItemName"] != null) {	
			codeVal = null;
			nameVal = null;		
			if (dicLines[i]["CenlItemCode"] != null) {				
				var fieldsCode : Array = ["heCode"];
				var valsCode : Array = [dicLines[i]["CenlItemCode"]];
				codeVal = dicLines[i]["CenlItemCode"];
				itemEntryID = sc$ApplImportScript.FindItemsOrServicesRecord(fieldsCode, valsCode, "heID");
			}
			else if (dicLines[i]["CenlItemName"] != null) {
				var fieldsDesc : Array = ["heName"];
				var valsDesc : Array = [dicLines[i]["CenlItemName"]];
				nameVal = dicLines[i]["CenlItemName"];
				itemEntryID = sc$ApplImportScript.FindItemsOrServicesRecord(fieldsDesc, valsDesc, "heID");
			}
			if (itemEntryID != null) {
				line.SetValue("ItemID", itemEntryID);
			}
		}
		if (itemEntryID != null) {
			if (dicLines[i]["CenlItemAlterCode"] !== undefined) {
				var fieldsItemAndAlterCode = ["heItemID", "heCode"];
				var valsItemAndAlterCode = [itemEntryID, dicLines[i]["CenlItemAlterCode"]];
				
				itemAlterCode = dicLines[i]["CenlItemAlterCode"];
				
				// Check whether the itemID and itemAlterCode pair exists only once
				itemAlterCodeID = sc$ApplImportScript.FindRecord("heItemAlterCodes", false, fieldsItemAndAlterCode, valsItemAndAlterCode, "heID");
				if (itemAlterCodeID != null) {
					line.SetValue("ItemID", itemEntryID);	
					line.SetValue("ItacID", itemAlterCodeID);
				}	
				else {
					sc$ApplImportScript.RaiseError(29, codeVal, nameVal, null, null, itemAlterCode, dicLines[i]["@@Signature"]);
				}
			}
		} else {
			if (dicLines[i]["CenlItemAlterCode"] !== undefined) {
				var fieldsAlterCode = ["heCode"];
				var valsAlterCode = [dicLines[i]["CenlItemAlterCode"]];
				
				itemAlterCode = dicLines[i]["CenlItemAlterCode"];
				
				// Check whether itemAlterCode exists only once
				itemAlterCodeID = sc$ApplImportScript.FindRecord("heItemAlterCodes", false, fieldsAlterCode, valsAlterCode, "heID");
				if (itemAlterCodeID != null) {
					line.SetValue("ItacID", itemAlterCodeID);
				}
				else {
					sc$ApplImportScript.RaiseError(30, itemAlterCode, dicLines[i]["@@Signature"]);
				}
			} else {
				sc$ApplImportScript.RaiseError(28, codeVal, nameVal);
			}
		}

		if (dicLines[i]["CenlPrice"] != null) {
			line.SetValue("Price", dicLines[i]["CenlPrice"]);
		}
		
		if (dicLines[i]["CenlAMeasurementQty"] != null) {
			line.SetValue("AQty", dicLines[i]["CenlAMeasurementQty"]);
		}		
		
		line.EndEdit();
	}
	centry.EndEdit();	
	docEntry.EndEdit();
		

	sc$Context.DataObjects.ExternalDataFix("Hercules", "PurchaseEntries", collection);
	actLogger = sc$ApplImportScript.SaveFromImport("Hercules", "PurchaseEntries", collection);
	logger.Merge(actLogger);
	
	var outDic = new scDictionary();
	outDic["Cookie"]  = sc$APIContext.GetCookie();
	outDic["EntityId"] = docEntry.ID;
	outDic["Supplier"] = supplier.ID;
	outDic["Messages"] = logger;

	return sc$Context.JsonSerialize(outDic);
}

function FindLookupItem(codeVal, nameVal, lookupTable, propName, entity, lookupVersion) {	
	var recID = sc$ApplImportScript.FindArrayCodeNameRecord(lookupTable, codeVal, nameVal, lookupVersion);	
	if (recID != null) {		
		entity.SetValue(propName, recID); 
	}
}